public class Test1111 {
    public void reverseString(char[] s) {
        int n = s.length;
        for(int left = 0,right = n-1;left<right;left++,right--){
            char temp = s[left];
            s[left] = s[right];
            s[right] = temp;
        }
    }
    public String minWindow(String s, String t) {
        // 特殊情况直接返回空
        if (s == null || s.length() == 0 || t == null || t.length() == 0 || s.length() < t.length()) {
            return "";
        }

        // 统计t的字符需求（ASCII字符用数组更高效）
        int[] need = new int[128];
        int target = 0; // 需要满足的字符种类数
        for (char c : t.toCharArray()) {
            if (need[c] == 0) {
                target++;
            }
            need[c]++;
        }

        int[] window = new int[128]; // 窗口内的字符频率
        int left = 0, valid = 0;     // 左指针、已满足的字符种类数
        int start = 0, len = Integer.MAX_VALUE; // 最小子串的起始位置、长度

        for (int right = 0; right < s.length(); right++) {
            char c = s.charAt(right);
            if (need[c] > 0) { // 当前字符是t需要的
                window[c]++;
                if (window[c] == need[c]) { // 该字符的数量刚好满足需求
                    valid++;
                }
            }

            // 当窗口包含t的所有字符时，尝试缩小窗口
            while (valid == target) {
                // 更新最小子串的记录
                if (right - left + 1 < len) {
                    start = left;
                    len = right - left + 1;
                }

                char d = s.charAt(left);
                if (need[d] > 0) { // 左指针指向的字符是t需要的
                    window[d]--;
                    if (window[d] < need[d]) { // 该字符的数量不再满足需求
                        valid--;
                    }
                }
                left++; // 左指针右移，缩小窗口
            }
        }

        return len == Integer.MAX_VALUE ? "" : s.substring(start, start + len);
    }
}

